草庐IT

c++ - Lua C++ 表迭代

全部标签

c++ - 结束的随机访问迭代器可以递增零吗?

标题说明了一切。给定一个迭代器结束,它可以在不调用未定义行为的情况下递增零吗?恰当的例子-如果索引超出范围,以下代码是否可以将迭代器返回到指定的索引-或者end?std::vector::iteratorClass::fromIndex(size_tindex){returnmember_vector.begin()+std::min(index,member_vector.size());}如果std::advance或std::next的行为不同,那也很有趣,但在这里我特别感兴趣的是运算符+。 最佳答案 这是一个定义明确的空操作

c++ - 如何使用自动变量选择迭代器类型?

我有一个std::unordered_mapstd::unordered_mapmyMap;我想使用find获得一个const迭代器。在c++03中我会做std::unordered_map::const_iterator=myMap.find("SomeValue");在c++11中,我想使用auto来减少模板数量auto=myMap.find("SomeValue");这是const_iterator还是迭代器?编译器如何决定使用哪个?有没有办法强制它选择const? 最佳答案 如果myMap是一个非常量表达式,它将使用非常量迭

c++ - std::list 与 std::vector 迭代

据说由于优化了缓存,遍历一个vector(如读取它的所有元素)比遍历一个列表更快。网络上是否有任何资源可以量化它对性能的影响程度?此外,使用自定义链表是否会更好,哪些元素将被预先分配以便它们在内存中是连续的?背后的想法是我想以不会改变的特定顺序存储元素。我仍然需要能够在运行时在中间快速插入一些,但大多数仍然是连续的,因为顺序不会改变。元素是连续的这一事实是否对缓存有影响,或者因为我仍将调用list_element->next而不是++list_element它会没有任何改善? 最佳答案 vector和列表之间的主要区别在于,在vec

c++ - postfix++/-- 运算符的低效率是否会针对 STL 迭代器进行优化?

我知道自增/自减运算符的后缀版本通常会由编译器针对内置类型进行优化(即不会进行复制),但iterator是否属于这种情况是吗?它们本质上只是重载运算符,可以通过多种方式实现,但由于它们的行为是严格定义的,能否优化它们,如果可以,它们是否被任何/许多人优化编译器?#includevoidfoo(std::vector&v){for(std::vector::iteratori=v.begin();i!=v.end();i++){//willthisgetoptimisedbythecompiler?*i+=20;}} 最佳答案 在st

c++ - std::list - 迭代器是否在移动时失效?

std::list迭代器有一些非常好的属性——当任何其他元素被移除时,当一个新元素被添加时,甚至当2个列表被交换时,它们仍然有效(Iteratorinvalidationrules)!考虑到以下代码行为,并且迭代器是通过一种指向实际节点的指针形式实现的,当列表移动时它不会改变,我的猜测是迭代器在新容器中仍然有效时std::list已移动,但我也可以通过访问实际上具有“预期”值的无效内存来进入UB区域。std::listl1{3,2,1};std::listl2;autoit=std::prev(l1.end());std::cout如果std::list移动时迭代器仍然有效,是否由标准

C++ REST SDK (Casablanca) web::json 迭代

https://msdn.microsoft.com/library/jj950082.aspx有以下代码。voidIterateJSONValue(){//CreateaJSONobject.json::valueobj;obj[L"key1"]=json::value::boolean(false);obj[L"key2"]=json::value::number(44);obj[L"key3"]=json::value::number(43.6);obj[L"key4"]=json::value::string(U("str"));//Loopovereachelementint

c++ - 二叉搜索树中的有序遍历复杂性(使用迭代器)?

相关问题:TimeComplexityofInOrderTreeTraversalofBinaryTreeO(N)?,但是它基于递归遍历(因此在O(logN)空间中),而迭代器只允许消耗O(1)空间。在C++中,通常要求递增标准容器的迭代器是O(1)操作。对于大多数容器来说,它的证明是微不足道的,但是对于map等,它似乎有点困难。如果将map实现为skip-list,那么结果将是显而易见的然而,它们通常被实现为红黑树(或至少作为二叉搜索树)因此,在有序遍历期间,有时“下一个”值不是那么容易达到。例如,如果您指向左子树的右下角叶子,那么下一个要遍历的节点就是根,距离depth步远。我已经

c++ - std::list<>::splice 使迭代器无效。理由?

我想知道制作std::list::splice背后的基本原理是什么使引用被拼接到新容器中的子序列的迭代器无效。这对我来说有点不合逻辑,尤其是考虑到标准std::container::swap规范。根据语言标准std::container::swap不会使任何迭代器失效。这是一个完全合理的实用规范。但是,我会说std::list::splice也会从保留迭代器的行为中受益匪浅。我知道可能有一些基于迭代器可达性等概念的纯学术考虑。但同时splice是std::list-特定操作,这意味着为其提供定制规范可能不会对一般的STL设计造成严重的概念性损害。那是什么?它是否会使std::list的

c++ - 从反向迭代器获取 vector 中的索引

我知道如何从vector迭代器中获取索引,方法是从中减去begin迭代器。例如:vector::iteratorit=find(vec.begin(),vec.end(),x);size_tposition=it-vec.begin();但是,现在我想找到vector中最后一个x的索引。如何从反向迭代器中获取真实索引?我发现以下似乎有效(编辑:无效)但也许有更好的(更惯用的或其他..)方式。vector::reverse_iteratorit=find(vec.rbegin(),vec.rend(),x);size_tposition=vec.size()-(it-vec.rbegin

c++ - 使用基于范围的 for 迭代图的边缘

我将图形表示为std::vector>neighbors,也就是说,顶点是整数,对于每个顶点,我们保留一组它的邻居。因此,要遍历所有边缘,我会做类似的事情for(unsignedu=0;u现在,我希望能够从中获得同样的效果for(autoe:g.edges())std::cout哪里g来自封装neighbors的类vector。然而,我尝试的一切似乎都极其复杂,我能想出的最好的版本有50行,而且很难看出它是正确的。有没有简单的方法可以做到这一点?这是我丑陋的版本:#include#include#includetypedefunsignedVertex;classGraph{publi